| @@ -24,7 +24,8 @@ class WebRequestsController < ApplicationController | ||
| 24 | 24 | if user | 
| 25 | 25 | agent = user.agents.find_by_id(params[:agent_id]) | 
| 26 | 26 | if agent | 
| 27 | - content, status, content_type = agent.trigger_web_request(params.except(:action, :controller, :agent_id, :user_id, :format), request.method_symbol.to_s, request.format.to_s) | |
| 27 | + content, status, content_type = agent.trigger_web_request(request) | |
| 28 | + | |
| 28 | 29 | if content.is_a?(String) | 
| 29 | 30 | render :text => content, :status => status || 200, :content_type => content_type || 'text/plain' | 
| 30 | 31 | elsif content.is_a?(Hash) | 
| @@ -46,7 +47,7 @@ class WebRequestsController < ApplicationController | ||
| 46 | 47 | secret = params[:secret] | 
| 47 | 48 |        user.agents.of_type(Agents::UserLocationAgent).each { |agent| | 
| 48 | 49 | if agent.options[:secret] == secret | 
| 49 | - agent.trigger_web_request(params.except(:action, :controller, :user_id, :format), request.method_symbol.to_s, request.format.to_s) | |
| 50 | + agent.trigger_web_request(request) | |
| 50 | 51 | end | 
| 51 | 52 | } | 
| 52 | 53 | render :text => "ok" | 
| @@ -100,6 +100,10 @@ class Agent < ActiveRecord::Base | ||
| 100 | 100 | ["not implemented", 404] | 
| 101 | 101 | end | 
| 102 | 102 |  | 
| 103 | + # alternate method signature for receive_web_request | |
| 104 | + # def receive_web_request(request=ActionDispatch::Request.new( ... )) | |
| 105 | + # end | |
| 106 | + | |
| 103 | 107 | # Implement me in your subclass to decide if your Agent is working. | 
| 104 | 108 | def working? | 
| 105 | 109 | raise "Implement me in your subclass" | 
| @@ -149,7 +153,8 @@ class Agent < ActiveRecord::Base | ||
| 149 | 153 | end | 
| 150 | 154 | end | 
| 151 | 155 |  | 
| 152 | - def trigger_web_request(params, method, format) | |
| 156 | + def trigger_web_request(request) | |
| 157 | + params = request.params.except(:action, :controller, :agent_id, :user_id, :format) | |
| 153 | 158 | if respond_to?(:receive_webhook) | 
| 154 | 159 | Rails.logger.warn "DEPRECATED: The .receive_webhook method is deprecated, please switch your Agent to use .receive_web_request." | 
| 155 | 160 | receive_webhook(params).tap do | 
| @@ -157,7 +162,12 @@ class Agent < ActiveRecord::Base | ||
| 157 | 162 | save! | 
| 158 | 163 | end | 
| 159 | 164 | else | 
| 160 | - receive_web_request(params, method, format).tap do | |
| 165 | + if method(:receive_web_request).arity == 1 | |
| 166 | + handled_request = receive_web_request(request) | |
| 167 | + else | |
| 168 | + handled_request = receive_web_request(params, request.method_symbol.to_s, request.format.to_s) | |
| 169 | + end | |
| 170 | + handled_request.tap do | |
| 161 | 171 | self.last_web_request_at = Time.now | 
| 162 | 172 | save! | 
| 163 | 173 | end | 
| @@ -736,12 +736,44 @@ describe Agent do | ||
| 736 | 736 | end | 
| 737 | 737 |  | 
| 738 | 738 | it "calls the .receive_web_request hook, updates last_web_request_at, and saves" do | 
| 739 | -        @agent.trigger_web_request({ :some_param => "some_value" }, "post", "text/html") | |
| 739 | +        request = ActionDispatch::Request.new({ | |
| 740 | +          'action_dispatch.request.request_parameters' => { :some_param => "some_value" }, | |
| 741 | + 'REQUEST_METHOD' => "POST", | |
| 742 | + 'HTTP_ACCEPT' => 'text/html' | |
| 743 | + }) | |
| 744 | + | |
| 745 | + @agent.trigger_web_request(request) | |
| 740 | 746 |          expect(@agent.reload.memory['last_request']).to eq([ { "some_param" => "some_value" }, "post", "text/html" ]) | 
| 741 | 747 | expect(@agent.last_web_request_at.to_i).to be_within(1).of(Time.now.to_i) | 
| 742 | 748 | end | 
| 743 | 749 | end | 
| 744 | 750 |  | 
| 751 | + context "when .receive_web_request is defined with just request" do | |
| 752 | + before do | |
| 753 | + @agent = Agents::WebRequestReceiver.new(:name => "something") | |
| 754 | + @agent.user = users(:bob) | |
| 755 | + @agent.save! | |
| 756 | + | |
| 757 | + def @agent.receive_web_request(request) | |
| 758 | +          memory['last_request'] = [request.params, request.method_symbol.to_s, request.format, {'HTTP_X_CUSTOM_HEADER' => request.headers['HTTP_X_CUSTOM_HEADER']}] | |
| 759 | + ['Ok!', 200] | |
| 760 | + end | |
| 761 | + end | |
| 762 | + | |
| 763 | + it "calls the .trigger_web_request with headers, and they get passed to .receive_web_request" do | |
| 764 | +        request = ActionDispatch::Request.new({ | |
| 765 | +          'action_dispatch.request.request_parameters' => { :some_param => "some_value" }, | |
| 766 | + 'REQUEST_METHOD' => "POST", | |
| 767 | + 'HTTP_ACCEPT' => 'text/html', | |
| 768 | + 'HTTP_X_CUSTOM_HEADER' => "foo" | |
| 769 | + }) | |
| 770 | + | |
| 771 | + @agent.trigger_web_request(request) | |
| 772 | +        expect(@agent.reload.memory['last_request']).to eq([ { "some_param" => "some_value" }, "post", "text/html", {'HTTP_X_CUSTOM_HEADER' => "foo"} ]) | |
| 773 | + expect(@agent.last_web_request_at.to_i).to be_within(1).of(Time.now.to_i) | |
| 774 | + end | |
| 775 | + end | |
| 776 | + | |
| 745 | 777 | context "when .receive_webhook is defined" do | 
| 746 | 778 | before do | 
| 747 | 779 | @agent = Agents::WebRequestReceiver.new(:name => "something") | 
| @@ -755,8 +787,14 @@ describe Agent do | ||
| 755 | 787 | end | 
| 756 | 788 |  | 
| 757 | 789 | it "outputs a deprecation warning and calls .receive_webhook with the params" do | 
| 790 | +        request = ActionDispatch::Request.new({ | |
| 791 | +          'action_dispatch.request.request_parameters' => { :some_param => "some_value" }, | |
| 792 | + 'REQUEST_METHOD' => "POST", | |
| 793 | + 'HTTP_ACCEPT' => 'text/html' | |
| 794 | + }) | |
| 795 | + | |
| 758 | 796 |          mock(Rails.logger).warn("DEPRECATED: The .receive_webhook method is deprecated, please switch your Agent to use .receive_web_request.") | 
| 759 | -        @agent.trigger_web_request({ :some_param => "some_value" }, "post", "text/html") | |
| 797 | + @agent.trigger_web_request(request) | |
| 760 | 798 |          expect(@agent.reload.memory['last_webhook_request']).to eq({ "some_param" => "some_value" }) | 
| 761 | 799 | expect(@agent.last_web_request_at.to_i).to be_within(1).of(Time.now.to_i) | 
| 762 | 800 | end |